package com.cskaoyan.javase.oop2._1extends._6limit;

import com.sun.corba.se.impl.orbutil.CorbaResourceUtil;

/**
 * 继承的限制
 * 在前面，继承的定义中，我们说子类会继承父类的所有成员，那么思考以下问题：
 * 在父类的结构中,有些比较特殊的
 *      1.父类的私有成员能不能继承?
 *          子类继承父类,如果直接创建子类对象去访问父类中的私有成员
 *          会发现没有访问权限
 *          那么究竟有没有继承呢?
 *          是继承了的,只是没有访问权限,这时只要父类提供一个有访问权限的Getter方法
 *          子类对象仍然能够访问该私有成员
 *
 *          当然,除此之外,任何父类中子类没有权限的成员,子类都没有办法直接访问,但都继承了.
 *          子类继承父类的成员,是继承了所有,无论什么权限.但具体子类对象能不能访问,就要受权限控制了.
 *
 *     2.父类中的构造器能不能继承?
 *          构造器是不能继承的,继承也没有意义
 *
 *     3.父类的静态成员能不能继承?
 *      在讲继承定义时,我们说过,继承指的是子类继承父类的成员(变量/方法),没有提静态成员,那么静态成员可以继承吗?
 *      严格来说,静态成员不属于继承,也不能继承
 *      如果子类中没有父类的同名静态成员,那么子类可以和父类"共用"父类的静态成员
 *      如果子类中有父类的同名静态成员,那么父子类"各用各的"静态成员.
 *
 *      总之,静态成员是属于类的,继承是对象之间的关系,类之间不谈继承关系,不属于继承,不是继承
 *
 * @since 11:36
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        // 'num' has private access in 'com.cskaoyan.javase.oop2._1extends._6limit.Father'
        // System.out.println(s.num);
        System.out.println(s.getNum());
        System.out.println("-----------------------");
        /*
        // 在子类没有numStatic同名静态成员时,父子类共用父类的静态成员
        System.out.println(Father.numStatic);
        System.out.println(Son.numStatic);

        Son.numStatic = 888;
        System.out.println(Father.numStatic);*/

        // 父子类都有一个静态成员,叫numStatic
        System.out.println(Father.numStatic);
        System.out.println(Son.numStatic);
        Father.numStatic = 888;
        System.out.println(Father.numStatic);
        System.out.println(Son.numStatic);
    }
}

class Father {
    private int num = 666;

    static int numStatic = 777;

    public int getNum() {
        return num;
    }

}

class Son extends Father {
    static int numStatic = 0;
}